package com.woniu.utils;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.CodeSignature;

public class AopUtils {
    /**
     * 该方法用于获取对象的指定字段的值。它通过传入对象实例和字段名，
     * 利用反射机制获取对象的所有字段，并找到匹配的字段名后返回其对应的值
     */
    public static Object getFieldValue(Object obj, String name) throws Exception {
        Field[] fields = obj.getClass().getDeclaredFields();
        Object object = null;
        for (Field field : fields){
            field.setAccessible(true);
            if (field.getName().toUpperCase().equals(name.toUpperCase())){
                object = field.get(obj);
                break;
            }
        }
        return object;
    }

    /**
     * 该方法用于获取方法执行时的参数及其取值。它通过传入 ProceedingJoinPoint 对象，
     * 首先获取方法执行时的参数数组和参数名数组，然后将它们以键值对的形式存储在一个 Map 中返回
     * @param joinPoint
     * @return
     */
    public static Map<String, Object> getParamValue(ProceedingJoinPoint joinPoint) {
        Object[] paramValues = joinPoint.getArgs();
        String[] paramNames = ( (CodeSignature) joinPoint.getSignature()).getParameterNames();
        Map<String, Object> param = new HashMap<>(paramNames.length);
        
        for (int i = 0; i < paramNames.length; i++){
            param.put(paramNames[i], paramValues[i]);
        }
        return param;
    }
}
